package io.github.echarts.option;

import io.github.echarts.option.abstracts.AbstractOption;
import io.github.echarts.option.component.Axis;
import io.github.echarts.option.component.Grid;
import io.github.echarts.option.component.Legend;
import io.github.echarts.option.component.Radar;
import io.github.echarts.option.component.Title;
import io.github.echarts.option.component.Tooltip;
import io.github.echarts.option.series.SeriesOption;

import java.util.Arrays;
/**
 * ECharts图表配置的顶层类。
 * 包含图表的所有配置选项。
 */
public class EChartOption extends AbstractOption {
    
    private static final long serialVersionUID = 1L;
    
    private Title title;
    private Legend legend;
    private SeriesOption[] series;
    private Boolean animation = false; // 默认禁用动画，因为服务端渲染不支持
    private String backgroundColor;
    private Axis xAxis;
    private Axis yAxis;
    private Grid grid;
    private Radar radar;
    private Tooltip tooltip;
    private String theme;  // 主题名称
    
    public EChartOption() {
        // 默认构造函数
    }
    
    /**
     * 获取图表标题配置。
     *
     * @return 标题配置
     */
    public Title getTitle() {
        return title;
    }
    
    /**
     * 设置图表标题配置。
     *
     * @param title 标题配置
     * @return 当前配置实例，用于链式调用
     */
    public EChartOption setTitle(Title title) {
        this.title = title;
        return this;
    }
    
    /**
     * 获取图例配置。
     *
     * @return 图例配置
     */
    public Legend getLegend() {
        return legend;
    }
    
    /**
     * 设置图例配置。
     *
     * @param legend 图例配置
     * @return 当前配置实例，用于链式调用
     */
    public EChartOption setLegend(Legend legend) {
        this.legend = legend;
        return this;
    }
    
    /**
     * 获取图表系列数据配置。
     *
     * @return 系列数据配置数组
     */
    public SeriesOption[] getSeries() {
        return series;
    }
    
    /**
     * 设置图表系列数据配置。
     *
     * @param series 系列数据配置数组
     * @return 当前配置实例，用于链式调用
     */
    public EChartOption setSeries(SeriesOption... series) {
        this.series = series;
        return this;
    }
    
    /**
     * 获取图表背景颜色。
     *
     * @return 背景颜色
     */
    public String getBackgroundColor() {
        return backgroundColor;
    }
    
    /**
     * 设置图表背景颜色。
     *
     * @param backgroundColor 背景颜色
     * @return 当前配置实例，用于链式调用
     */
    public EChartOption setBackgroundColor(String backgroundColor) {
        this.backgroundColor = backgroundColor;
        return this;
    }
    
    /**
     * 获取动画是否开启。
     *
     * @return 如果开启动画则为true，否则为false
     */
    public Boolean getAnimation() {
        return animation;
    }
    
    /**
     * 设置动画是否开启。
     * 注意：服务端渲染不支持动画效果。
     *
     * @param animation 是否开启动画
     * @return 当前配置实例，用于链式调用
     */
    public EChartOption setAnimation(Boolean animation) {
        this.animation = animation;
        return this;
    }
    
    /**
     * 获取x轴配置。
     *
     * @return x轴配置
     */
    public Axis getXAxis() {
        return xAxis;
    }
    
    /**
     * 设置x轴配置。
     *
     * @param xAxis x轴配置
     * @return 当前配置实例，用于链式调用
     */
    public EChartOption setXAxis(Axis xAxis) {
        this.xAxis = xAxis;
        return this;
    }
    
    /**
     * 获取y轴配置。
     *
     * @return y轴配置
     */
    public Axis getYAxis() {
        return yAxis;
    }
    
    /**
     * 设置y轴配置。
     *
     * @param yAxis y轴配置
     * @return 当前配置实例，用于链式调用
     */
    public EChartOption setYAxis(Axis yAxis) {
        this.yAxis = yAxis;
        return this;
    }
    
    /**
     * 获取网格配置。
     *
     * @return 网格配置
     */
    public Grid getGrid() {
        return grid;
    }
    
    /**
     * 设置网格配置。
     *
     * @param grid 网格配置
     * @return 当前配置实例，用于链式调用
     */
    public EChartOption setGrid(Grid grid) {
        this.grid = grid;
        return this;
    }
    
    /**
     * 获取雷达图坐标系配置。
     *
     * @return 雷达图坐标系配置
     */
    public Radar getRadar() {
        return radar;
    }
    
    /**
     * 设置雷达图坐标系配置。
     *
     * @param radar 雷达图坐标系配置
     * @return 当前配置实例，用于链式调用
     */
    public EChartOption setRadar(Radar radar) {
        this.radar = radar;
        return this;
    }
    
    /**
     * 获取提示框配置。
     *
     * @return 提示框配置
     */
    public Tooltip getTooltip() {
        return tooltip;
    }
    
    /**
     * 设置提示框配置。
     *
     * @param tooltip 提示框配置
     * @return 当前配置实例，用于链式调用
     */
    public EChartOption setTooltip(Tooltip tooltip) {
        this.tooltip = tooltip;
        return this;
    }
    
    /**
     * 获取主题名称。
     *
     * @return 主题名称
     */
    public String getTheme() {
        return theme;
    }
    
    /**
     * 设置主题名称。
     *
     * @param theme 主题名称
     * @return 当前配置实例，用于链式调用
     */
    public EChartOption setTheme(String theme) {
        this.theme = theme;
        return this;
    }

    @Override
    public boolean validate() {
        // 有效的配置至少需要一个系列
        return series != null && series.length > 0;
    }
    
    @Override
    public String toString() {
        return "EChartOption{" +
                "title=" + title +
                ", legend=" + legend +
                ", series=" + Arrays.toString(series) +
                ", backgroundColor='" + backgroundColor + '\'' +
                ", animation=" + animation +
                ", theme='" + theme + '\'' +
                ", tooltip=" + tooltip +
                '}';
    }
} 